#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// int* getarray()
// {
//     static int a[3] = {1,2,3};
//     return a;
// }

struct student
{
    int id;
    char *name;
};
typedef struct student Stu;

//初始化
Stu* InitStu(const char *name,int id)
{
    Stu *s = (Stu*)malloc(sizeof(Stu));
    if(s == NULL)
    return NULL;

    s->name = (char *)malloc(sizeof(name)+1);
    if(s->name == NULL)
    {
        free(s);//如果申请失败,就表示前面的申请成功,先把前面申请的空间释放
        return NULL;
    }
    strcpy(s->name,name);
    s->id = id;
}

//释放内存
void ClearStu(Stu *s)
{
    free(s->name);
    free(s);
}

int main()
{
    // //堆上空间申请函数
    // int *a = (int *)malloc(4);
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }
    // *a = 10;
    // printf("%d\n",*a);

    // //释放申请的内存
    // free(a);

    // //申请一维数组
    // int *a = malloc(10 * sizeof(int));
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }
    // for(int i = 0; i < 10; i++)
    // {
    //     a[i] = i+1;
    //     printf("%d ",a[i]);
    // }
    // printf("\n");
    // free(a);

    // //申请二位数组
    // int** a = (int **)malloc(2 * sizeof(int *));
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }
    // for(int i = 0; i < 2; i++)
    // {
    //     a[i] = (int *)malloc(3 * sizeof(int));
    //     if(a[i] == NULL)
    //     {
    //         printf("malloc error!\n");
    //         return -1;
    //     }
    // }
    // for(int i = 0; i < 2; i++)
    // {
    //     for(int j = 0; j < 3; j++)
    //     {
    //         a[i][j] = i * 3 + (j+1);
    //         printf("%d ",a[i][j]);
    //     }
    //     printf("\n");
    // }
    // for(int i = 0; i < 2; i++)
    // {
    //     free(a[i]);
    // }
    // free(a);

    //申请结构体
    // Stu *s = (Stu*)malloc(sizeof(Stu));
    // if(s == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }
    // s->id = 1;
    // char *name = "zhangsan";
    // s->name = (char *)malloc(strlen(name) + 1);
    // strcpy(s->name,name);
    // printf("%d %s\n",s->id,s->name);
    // free(s->name);
    // free(s)
    
    // // 二次释放问题
    // if(a != NULL)
    // {
    //     free(a);
    //     a = NULL;
    // }
    // if(a != NULL)
    // {
    //     free(a);
    //     a = NULL;
    // }
  

    Stu *s = InitStu("zhangsan",1);
    if(s == NULL)
    return 0;
    printf("%d %s\n",s->id,s->name);
    ClearStu(s);
    //释放以后要置空
    s == NULL;
    return 0;
}